插播一篇我自己在工作上遇到的問題
我相信不會只有我遇到
提供給大家問題分析及解決流程
日後若遇到可以有個對照方式去處理![]()
![]()
![]()
狀況是這樣的
我接手了一個前輩的單機程式
vs工具開發, 語言是C#
這程式原本都好好的
沒什麼發病
突然有一天牙起來
使用者反映程式跳了一個視窗
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
於是乎我就去檢查他電腦裡是不是有安裝Word
結果勒, 不只有裝, 還裝到了Office 2016
連我自己電腦裡都只有2010的![]()
好吧, 看來要來Debug了...
要除蟲必先抓蟲
老實說這程式交與我手, 也從來沒把整段程式看完過xD
碼海茫茫要如何找到我想要的
幸好, 已經有線索了
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
咱來Ctrl+F再Ctrl+V一下
果然馬上找到, 真棒![]()

而在跳出這個錯誤訊息之前
有一段程式去檢測了 Word的登錄碼
目前檢測了 2010 & 2013 & 2016 三種版本是否存在登錄碼
且在我本機(有安裝Office 2010)執行
確實可以抓的到akey_2010這個RegistryKey
但, 使用者電腦的是Office 2016...
於是我只好忍痛砍了我的2010![]()
再見了2010, 你好啊2016~
安裝完之後再來執行一次程式
竟然!!!!!
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
我有裝Office你別跟我抱歉阿!!![]()
實際開了Word確認看看是不是真的有裝好
真的裝好了...
到底為什麼抓不到登錄碼...
自己想破頭也找不到原因, 只好請教估狗大神
而估狗大神也完美的幫我找到了解答
看的懂嗎? 我英文初級都沒過是看不太懂, 所以我用了機翻![]()

這樣應該勉強能看懂
原因出在程式本身開發時就設定32位元
32位元環境下程式碼就自動編譯了這個路徑
多了WoW6432Node這段
那多了這段, 想當然爾, 身為64位元的Office 2016是絕對抓不到的
於是乎, 這蟲就這麼給抓到了![]()
抓到了蟲, 要怎麼除呢?
首先程式肯定是要改成64位元可以使用的
於是平台的部分原本是x86就改為Any CPU
但不改還好, 改下去夭壽, 一窩蜂問題立馬跑出來![]()
還好我還扛的住
有發現問題都出自同一人之手
就是 Microsoft.Office.Core
不要問我怎麼知道的
只要把他的參考原為14.0更新成16.0就好
更新更起來!!
你以為結束了嗎? 我以為是, 但卻還沒結束
因為我家是用Oracle DB, 就牽涉到了 Provider的問題
原本的Provider是 MSDAORA.1
但因為MSDAORA只支援32位元
所以要換個可以支援64位元的Provider - OraOLEDB.Oracle
這問題就能解決了!!
於是我啟動了程式, 執行也沒問題, 也不再跳錯誤了, 完美!!![]()
你以為結束了嗎? 這麼簡單我還要發這篇文嗎?
本來是可以就這樣結束結案掉的
誰知道!!在我裝回Office2010之後竟然又跳出來
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
我的天哪!!![]()
就在我瀕臨崩潰之際, 一道光從我天靈蓋噴出來
原來我千算萬算, 卻漏算了它 - WoW6432Node
我們已經知道在64位元時的路徑是這樣:
SOFTWARE\Microsoft\Office\14.0\Word\InstallRoot\
而32位元時路徑會被自動轉譯成這樣:
SOFTWARE\WoW6432Node\Microsoft\Office\14.0\Word\InstallRoot\
所以當我在x64時要去抓32位元的Office, 當然也是抓不到
因為64位元沒有自動轉譯阿!!!![]()
最後我在檢測登錄碼的地方加上了32位元的檢測路徑
程式總算是不再跟我抱歉了...
解這問題花了我大半天時間...
也讓我學到蠻多東西
而且也不能說是前輩寫的Code有問題
在當時的環境下, 可能就只能用32位元
說不準幾年後出了128位元 256位元
我們開發的64位元系統也被後輩拿來嘴![]()
共勉之~